home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / edu / gr_pl01 / gr_pl01.bas next >
BASIC Source File  |  1995-08-13  |  19KB  |  528 lines

  1. 10 REM = GRAPH PLOTER 3D TYPE-50B
  2. 20 REM == 初期設定(変数)
  3. 30 DIM IFA%(25),IFB(50),ANS(25),PRO(50),MOCL%(3),INCH%(256)
  4. 40 MODE%=1:DEN%=10:SX=0:SY=0:SZ=0:RA=1:MN%=0:MOCL%(MN%)=0:FUN$="0"
  5. 50 WHIA$=CHR$(&H3F,&HFF,&H5F,&HFF,&H6F,&HFF,&H77,&HFF,&H7B,&HFF,&H7D,&HFF,&H7E,&HFF,&H7F,&H7F,&H7F,&HBF,&H7F,&HDF,&H7F,&HCF,&H7F,&H3F,&H7C,&HFF,&H73,&HFF,&H4F,&HFF,&H3F,&HFF)
  6. 60 WHIB$=CHR$(&H00,&H00,&H40,&H00,&H60,&H00,&H70,&H00,&H78,&H00,&H7C,&H00,&H6E,&H00,&H67,&H00,&H63,&H80,&H61,&HC0,&H61,&HE0,&H67,&H80,&H7E,&H00,&H78,&H00,&H60,&H00,&H00,&H00)
  7. 70 ON ERROR GOTO 5270
  8. 80 STOP OFF
  9. 90 REM == 初期設定(画面)
  10. 100 WIDTH 80,25:SCREEN@ 1,1,(64,83):WINDOW(0,0)-(399,299):COLOR 7,,,4:CLS:
  11. 110 MOUSE 0:MOUSE 1,500,120,1:MOUSE 4,0,0,511,255:ON MOUSE(2) GOSUB 2900:MOUSE(2) ON
  12. 120 MOUSE 2,WHIA$,WHIB$
  13. 130 GOSUB 970:GOSUB 1030:WINDOW (0,0)-(399,299)
  14. 140 REM = CONTROLER TYPE-50 ================
  15. 150 REM == MAIM 0
  16. 160 IF MOCL%(MN%)=32767 THEN MOCL%(MN%)=0:GOSUB 930
  17. 170 ON MOCL%(MN%) GOSUB 200,250,300,350,390,430,480,530,580,630,680,730,780,830,880
  18. 180 GOTO 160
  19. 190 REM == 機能0-1
  20. 200 MOCL%(MN%)=0:IX%=58:IY%=5:INLM%=6:INBA$=STR$(SX):INTY%=1
  21. 210 GOSUB 2380
  22. 220 SX=VAL(INPR$)
  23. 230 RETURN
  24. 240 REM == 機能0-2
  25. 250 MOCL%(MN%)=0:IX%=66:IY%=5:INLM%=6:INBA$=STR$(SY):INTY%=1
  26. 260 GOSUB 2380
  27. 270 SY=VAL(INPR$)
  28. 280 RETURN
  29. 290 REM == 機能0-3
  30. 300 MOCL%(MN%)=0:IX%=63:IY%=6:INLM%=9:INBA$=STR$(RA):INTY%=1
  31. 310 GOSUB 2380
  32. 320 RA=VAL(INPR$)
  33. 330 RETURN
  34. 340 REM == 機能0-4
  35. 350 MOCL%(MN%)=0:MODE%=1
  36. 360 LOCATE 49,8:PRINT "◆":LOCATE 61,8:PRINT "◇"
  37. 370 RETURN
  38. 380 REM == 機能0-5
  39. 390 MOCL%(MN%)=0:MODE%=0
  40. 400 LOCATE 49,8:PRINT "◇":LOCATE 61,8:PRINT "◆"
  41. 410 RETURN
  42. 420 REM == 機能0-6
  43. 430 MOCL%(MN%)=0:IX%=56:IY%=9:INLM%=16:INBA$=STR$(DEN%):INTY%=1
  44. 440 GOSUB 2380
  45. 450 DEN%=VAL(INPR$)
  46. 460 RETURN
  47. 470 REM == 機能0-7
  48. 480 MOCL%(MN%)=0:GRCO%=GRCO%-((GRCO% AND 1)=0)+((GRCO% AND 1)=1)
  49. 490 LOCATE 61,10
  50. 500 IF (GRCO% AND 1)=1 THEN PRINT "◆" ELSE PRINT "◇"
  51. 510 RETURN
  52. 520 REM == 機能0-8
  53. 530 MOCL%(MN%)=0:GRCO%=GRCO%-2*(((GRCO% AND 2)=0)-((GRCO% AND 2)=2))
  54. 540 LOCATE 49,11
  55. 550 IF (GRCO% AND 2)=2 THEN PRINT "◆" ELSE PRINT "◇"
  56. 560 RETURN
  57. 570 REM == 機能0-9
  58. 580 MOCL%(MN%)=0:GRCO%=GRCO%-4*(((GRCO% AND 4)=0)-((GRCO% AND 4)=4))
  59. 590 LOCATE 61,11
  60. 600 IF (GRCO% AND 4)=4 THEN PRINT "◆" ELSE PRINT "◇"
  61. 610 RETURN
  62. 620 REM == 機能0-10
  63. 630 MN%=MN%+1:ALE%=ALE%+4*(ALE% AND 3)
  64. 640 GOSUB 1120
  65. 650 MN%=MN%-1:MOCL%(MN%)=0
  66. 660 RETURN
  67. 670 REM == 機能0-11
  68. 680 MN%=MN%+1
  69. 690 GOSUB 1510
  70. 700 MN%=MN%-1:MOCL%(MN%)=0
  71. 710 RETURN
  72. 720 REM == 機能0-12
  73. 730 MN%=MN%+1
  74. 740 GOSUB 1900
  75. 750 MN%=MN%-1:MOCL%(MN%)=0
  76. 760 RETURN
  77. 770 REM == 機能0-13
  78. 780 MN%=MN%+1
  79. 790 GOSUB 2090
  80. 800 MN%=MN%-1:MOCL%(MN%)=0
  81. 810 RETURN
  82. 820 REM == 機能0-14
  83. 830 MOCL%(MN%)=0:IX%=17:IY%=17:INLM%=50:INBA$=FUN$:INTY%=0
  84. 840 GOSUB 2380
  85. 850 FUN$=INPR$
  86. 860 RETURN
  87. 870 REM == 機能0-15
  88. 880 MOCL%(MN%)=0:IX%=52:IY%=6:INLM%=5:INBA$=STR$(SZ):INTY%=1
  89. 890 GOSUB 2380
  90. 900 SZ=VAL(INPR$)
  91. 910 RETURN
  92. 920 REM == MAIN 0用 MOCL設定
  93. 930 MOCL%(MN%)=(CLRA%>47)*(CLRA%<56)+2*(CLRA%>55)*(CLRA%<64)+3*(CLRA%>113)*(CLRA%<128)+4*(CLRA%>232)*(CLRA%<243)+5*(CLRA%>244)*(CLRA%<249)+6*(CLRA%>296)*(CLRA%<320)+7*(CLRA%>372)*(CLRA%<378)+8*(CLRA%>424)*(CLRA%<430)
  94. 940 MOCL%(MN%)=MOCL%(MN%)+9*(CLRA%>436)*(CLRA%<442)+10*(CLRA%>488)*(CLRA%<495)+11*(CLRA%>500)*(CLRA%<507)+12*(CLRA%>552)*(CLRA%<559)+13*(CLRA%>564)*(CLRA%<571)-14*(CLRA%>767)+15*(CLRA%>105)*(CLRA%<114)
  95. 950 RETURN
  96. 960 REM == MAIN 0 グラフィック部初期化
  97. 970 VIEW(0,0)-(319,239),7
  98. 980 LINE (0,99)-(399,99),PSET,0
  99. 990 LINE (224,0)-(0,299),PSET,0
  100. 1000 LINE (149,0)-(149,299),PSET,0
  101. 1010 RETURN
  102. 1020 REM == MAIN 0  画面表示
  103. 1030 COLOR 9
  104. 1040 LOCATE 0,2:PRINT "      Graph Ploter 3D TYPE-50B "
  105. 1050 COLOR 7
  106. 1060 DILE%=24:IX%=48:IY%=5
  107. 1070 DIS$="[範囲]X:0     Y:0     "+"  Z:0     長さ:1        "+"[グラフタイプ]            "+" ◆ワイヤーフレーム  ◇点       [密度]10              [グラフの色] ◇X軸      "+" ◇Y軸       ◇Z軸      "+" <アラーム>      <印刷>     "+" <終了>      <実行>     "
  108. 1080 DIS$=DIS$+CHR$(0):GOSUB 2950
  109. 1090 LOCATE 7,17:PRINT "[関数]Z=0"
  110. 1100 RETURN
  111. 1110 REM == MAIN 1
  112. 1120 GOSUB 1470:GOSUB 1390
  113. 1130 IF MOCL%(MN%)=32767 THEN MOCL%(MN%)=0:GOSUB 1180
  114. 1140 ON MOCL%(MN%) GOSUB 1210,1250,1290,1330,1360
  115. 1150 IF MOCL%(MN%)=32766 THEN MOCL%(MN%)=0:GOSUB 3010:RETURN
  116. 1160 GOTO 1130
  117. 1170 REM == MAIN1用 MOCL設定
  118. 1180 MOCL%(MN%)=(CLRA%>682)*(CLRA%<688)+2*(CLRA%>688)*(CLRA%<694)+3*(CLRA%>694)*(CLRA%<700)+4*(CLRA%>754)*(CLRA%<761)+5*(CLRA%>761)*(CLRA%<766)
  119. 1190 RETURN
  120. 1200 REM == 機能1-1
  121. 1210 MOCL%(MN%)=0:ALE%=(ALE% AND &H000C)+1
  122. 1220 GOSUB 1390
  123. 1230 RETURN
  124. 1240 REM == 機能1-2
  125. 1250 MOCL%(MN%)=0:ALE%=(ALE% AND &H000C)+2
  126. 1260 GOSUB 1390
  127. 1270 RETURN
  128. 1280 REM == 機能1-3
  129. 1290 MOCL%(MN%)=0:ALE%=(ALE% AND &H000C)
  130. 1300 GOSUB 1390
  131. 1310 RETURN
  132. 1320 REM == 機能1-4
  133. 1330 MOCL%(MN%)=32766:ALE%=(ALE% AND &H0003)
  134. 1340 RETURN
  135. 1350 REM == 機能1-5
  136. 1360 MOCL%(MN%)=32766:ALE%=(ALE% AND &H000C)/4
  137. 1370 RETURN
  138. 1380 REM == MAIN 1 変化部表示
  139. 1390 FOR COUNTA%=0 TO 2
  140. 1400 LOCATE 6*COUNTA%+51,15:PRINT "◇"
  141. 1410 NEXT COUNTA%
  142. 1420 IF (ALE% AND 3)=1 THEN LOCATE 51,15:PRINT "◆"
  143. 1430 IF (ALE% AND 3)=2 THEN LOCATE 57,15:PRINT "◆"
  144. 1440 IF (ALE% AND 3)=0 THEN LOCATE 63,15:PRINT "◆"
  145. 1450 RETURN
  146. 1460 REM == MAIN 0 画面表示
  147. 1470 DILE%=24:IX%=48:IY%=14
  148. 1480 DIS$="[アラーム設定]            "+"     ON1   ON2   OFF    "+"           <設定><取消> "+CHR$(0)
  149. 1490 GOSUB 2950:RETURN
  150. 1500 REM == MAIN 2
  151. 1510 PRMO%=0:GOSUB 1850:GOSUB 1760
  152. 1520 IF MOCL%(MN%)=32767 THEN MOCL%(MN%)=0:GOSUB 1570
  153. 1530 ON MOCL%(MN%) GOSUB 1600,1640,1680,1730
  154. 1540 IF MOCL%(MN%)=32766 THEN MOCL%(MN%)=0:GOSUB 3010:RETURN
  155. 1550 GOTO 1520
  156. 1560 REM ==  MAIN 2 MOCL設定
  157. 1570 MOCL%(MN%)=(CLRA%>681)*(CLRA%<690)+2*(CLRA%>690)*(CLRA%<701)+3*(CLRA%>754)*(CLRA%<761)+4*(CLRA%>760)*(CLRA%<767)
  158. 1580 RETURN
  159. 1590 REM == 機能2-1
  160. 1600 MOCL%(MN%)=0:PRMO%=0
  161. 1610 GOSUB 1760
  162. 1620 RETURN
  163. 1630 REM == 機能2-2
  164. 1640 MOCL%(MN%)=0:PRMO%=1
  165. 1650 GOSUB 1760
  166. 1660 RETURN
  167. 1670 REM ==  機能2-3
  168. 1680 MOCL%(MN%)=32766
  169. 1690 HARDC 1+PRMO%
  170. 1700 GOSUB 3080
  171. 1710 RETURN
  172. 1720 REM ==  機能2-3
  173. 1730 MOCL%(MN%)=32766
  174. 1740 RETURN
  175. 1750 REM ==  MAIN 2 変化部表示
  176. 1760 FOR COUNTA=0 TO 1
  177. 1770 LOCATE 9*COUNTA+50,15:PRINT "◇"
  178. 1780 NEXT COUNTA
  179. 1790 LOCATE 50,15
  180. 1800 IF PRMO%=0 THEN PRINT "◆"
  181. 1810 LOCATE 59,15
  182. 1820 IF PRMO%=1 THEN PRINT "◆"
  183. 1830 RETURN
  184. 1840 REM == MAIN 2 画面表示
  185. 1850 DILE%=24:IX%=48:IY%=14
  186. 1860 DIS$="[印刷]                "+"    16階調   階調なし   "+"           <実行><取消> "+CHR$(0)
  187. 1870 GOSUB 2950
  188. 1880 RETURN
  189. 1890 REM == MAIN 3
  190. 1900 GOSUB 2040
  191. 1910 IF MOCL%(MN%)=32767 THEN MOCL%(MN%)=0:GOSUB 2010
  192. 1920 ON MOCL%(MN%) GOSUB 1960,1980
  193. 1930 IF MOCL%(MN%)=32766 THEN MOCL%(MN%)=0:GOSUB 3010:RETURN
  194. 1940 GOTO 1910
  195. 1950 REM == 機能3-1
  196. 1960 END
  197. 1970 REM == 機能3-2
  198. 1980 MOCL%(MN%)=32766
  199. 1990 RETURN
  200. 2000 REM == MAIN 3 MOCL
  201. 2010 MOCL%(MN%)=(CLRA%>754)*(CLRA%<761)+2*(CLRA%>760)*(CLRA%<767)
  202. 2020 RETURN
  203. 2030 REM == MAIN 3 画面表示
  204. 2040 DILE%=24:IX%=48:IY%=14
  205. 2050 DIS$="[終了]                "+"      終了します。      "+"           <実行><取消> "+CHR$(0)
  206. 2060 GOSUB 2950
  207. 2070 RETURN
  208. 2080 REM == MAIN 4
  209. 2090 GOSUB 2320
  210. 2100 IF MOCL%(MN%)=32767 THEN MOCL%(MN%)=0:GOSUB 2150
  211. 2110 ON MOCL%(MN%) GOSUB 2180,2290
  212. 2120 IF MOCL%(MN%)=32766 THEN MOCL%(MN%)=0:GOSUB 3010:RETURN
  213. 2130 GOTO 2100
  214. 2140 REM == MAIN 5 MOCL
  215. 2150 MOCL%(MN%)=(CLRA%>754)*(CLRA%<761)+2*(CLRA%>760)*(CLRA%<767)
  216. 2160 RETURN
  217. 2170 REM == 機能5-1
  218. 2180 MOCL%(MN%)=32766
  219. 2190 DILE%=24:IX%=48:IY%=14
  220. 2200 DIS$="[グラフ描画中]        "+"キーを押せば止まります。"+"                         "+CHR$(0)
  221. 2210 GOSUB 2950
  222. 2220 MOUSE(2) OFF
  223. 2230 GOSUB 4100
  224. 2240 GOSUB 3190
  225. 2250 GOSUB 3080
  226. 2260 MOUSE(2) ON
  227. 2270 RETURN
  228. 2280 REM == 機能5-2
  229. 2290 MOCL%(MN%)=32766
  230. 2300 RETURN
  231. 2310 REM == MAIN 5 画面表示
  232. 2320 DILE%=24:IX%=48:IY%=14
  233. 2330 DIS$="[実行]                "+"  グラフを描画します。  "+"           <実行><取消> "+CHR$(0)
  234. 2340 GOSUB 2950
  235. 2350 RETURN
  236. 2360 REM == キーボード入力
  237. 2370 REM == 初期設定
  238. 2380 MOUSE(2) OFF
  239. 2390 VIEW(0,0)-(511,255):WINDOW(0,0)-(511,255)
  240. 2400 FOR COUNTA%=0 TO 255
  241. 2410 INCH%(COUNTA%)=0
  242. 2420 NEXT COUNTA%
  243. 2430 LOCATE IX%,IY%,1:PRINT SPACE$(INLM%)
  244. 2440 REM = ANK INPUT SYSTEM TYPE-50 =========
  245. 2450 REM == 初期設定
  246. 2460 INCU%=0:IN$="":INPR$="":INLE%=LEN(INBA$)
  247. 2470 IF INLE%>0 THEN COUNTB%=0:FOR COUNTA%=0 TO INLE%-1:INCH%(COUNTB%)=ASC(MID$(INBA$,COUNTA%+1,1)):COUNTB%=COUNTB%-(INCH%(COUNTB%)<>32):NEXT COUNTA%
  248. 2480 INLE%=COUNTB%
  249. 2490 GOSUB 2660
  250. 2500 LINE(8*IX%-65,19*IY%-83)-(8*IX%-64,19*IY%-68),PSET,[160,120,255],B
  251. 2510 REM == MAIN
  252. 2520 WHILE(1)
  253. 2530 IN$=INKEY$
  254. 2540 IF IN$<>"" THEN INCC%=ASC(IN$):IN$=IN$+INKEY$:GOSUB 2560:GOSUB 2660:IF INCC%=13 THEN GOSUB 2750:RETURN
  255. 2550 WEND
  256. 2560 LINE(8*(IX%+INCU%)-65,19*IY%-83)-(8*(IX%+INCU%)-64,19*IY%-68),PSET,0,B
  257. 2570 REM == キーが押された時の処理
  258. 2580 REM == コントロールコードの処理
  259. 2590 IF INCC%=8 AND INCU%>0 THEN FOR COUNTA%=0 TO INLE%-INCU%:INCH%(INCU%+COUNTA%-1)=INCH%(INCU%+COUNTA%):NEXT COUNTA%:INCU%=INCU%-1:INLE%=INLE%-1
  260. 2600 IF INCC%=127 AND INLE%>INCU% THEN FOR COUNTA%=0 TO INLE%-INCU%-1:INCH%(INCU%+COUNTA%)=INCH%(INCU%+COUNTA%+1):NEXT COUNTA%:INLE%=INLE%-1
  261. 2610 INCU%=INCU%-(INCC%=29)*(INCU%>0)+(INCC%=28)*(INCU%<INLE%)
  262. 2620 REM == 一文字入力
  263. 2630 IF INCC%<127 AND INCC%>31 AND INLE%<INLM% THEN IN$=KEXT$(IN$,0):COUNTA%=0:WHILE(COUNTA%<=INLE%-INCU%-1):INCH%(INLE%-COUNTA%)=INCH%(INLE%-COUNTA%-1):COUNTA%=COUNTA%+1:WEND:INCH%(INCU%)=ASC(IN$):INLE%=INLE%+1:INCU%=INCU%+1
  264. 2640 RETURN
  265. 2650 REM == 入力状況容表示
  266. 2660 INBA$="":IN$=""
  267. 2670 FOR COUNTA%=0 TO INLE%-1
  268. 2680 INBA$=INBA$+CHR$(INCH%(COUNTA%))
  269. 2690 NEXT COUNTA%
  270. 2700 LINE(8*(IX%+INCU%)-65,19*IY%-83)-(8*(IX%+INCU%)-64,19*IY%-68),PSET,[160,120,255],B
  271. 2710 LOCATE IX%,IY%:PRINT SPACE$(INLM%)
  272. 2720 LOCATE IX%,IY%:PRINT INBA$
  273. 2730 RETURN
  274. 2740 REM == 入力終了の処理
  275. 2750 IF INBA$<>"" THEN INPR$=INBA$ ELSE INPR$=""
  276. 2760 LOCATE IX%,IY%:PRINT SPACE$(INLM%)
  277. 2770 LOCATE IX%,IY%
  278. 2780 IF INTY%=0 THEN PRINT INPR$ ELSE GOSUB 2830
  279. 2790 LINE(8*(IX%+INCU%)-65,19*IY%-83)-(8*(IX%+INCU%)-64,19*IY%-68),PSET,0,B
  280. 2800 VIEW(0,0)-(319,239):WINDOW(0,0)-(399,299)
  281. 2810 MOUSE(2) ON
  282. 2820 RETURN
  283. 2830 WHIA%=LEN(INPR$)
  284. 2840 WHIB=VAL(INPR$)
  285. 2850 FOR COUNTA%=0 TO WHIA%
  286. 2860 WHIA$=MID$(STR$(WHIB),COUNTA%+1,1)
  287. 2870 IF WHIA$<>" " THEN PRINT WHIA$;
  288. 2880 NEXT COUNTA%
  289. 2890 RETURN
  290. 2900 REM == マウスの割り込み
  291. 2910 MOX%=MOUSE(0):MOY%=MOUSE(1):MOCL%(MN%)=32767
  292. 2920 CLRA%=-(INT(MOX%/8)+INT((MOY%-12)/19)*64)*(MOY%>11)
  293. 2930 RETURN
  294. 2940 REM == 文字列表示
  295. 2950 DIPO%=1
  296. 2960 LOCATE IX%,IY%:PRINT MID$(DIS$,DIPO%,DILE%)
  297. 2970 DIPO%=DIPO%+DILE%:IY%=IY%+1
  298. 2980 IF MID$(DIS$,DIPO%,1)<>CHR$(0) THEN 2960
  299. 2990 RETURN
  300. 3000 REM == サブ画面消去
  301. 3010 FOR COUNTB%=0 TO 2
  302. 3020 FOR COUNTA%=0 TO 23
  303. 3030 LOCATE COUNTA%+48,COUNTB%+14:PRINT " "
  304. 3040 NEXT COUNTA%
  305. 3050 NEXT COUNTB%
  306. 3060 RETURN
  307. 3070 REM == アラーム
  308. 3080 ON ALE% GOSUB 3100,3120
  309. 3090 RETURN
  310. 3100 BEEP
  311. 3110 RETURN
  312. 3120 FOR COUNTA%=0 TO 5
  313. 3130 BEEP 1
  314. 3140 NEXT COUNTA%
  315. 3150 BEEP 0
  316. 3160 RETURN
  317. 3170 REM = PLOT SYSTEM 3D TYPE-50B ===========
  318. 3180 REM == 初期設定(画面)
  319. 3190 GOSUB 970
  320. 3200 REM ==  MAIN
  321. 3210 ON MODE%+1 GOSUB 3240,3360
  322. 3220 RETURN'リターン
  323. 3230 REM == POINT
  324. 3240 FOR COUNTA%=0 TO DEN%-1
  325. 3250 FOR COUNTB%=0 TO DEN%-1
  326. 3260 X=SX+RA*COUNTA%/DEN%:Y=SY+RA*COUNTB%/DEN%:GOSUB 3550
  327. 3270 PX%=149+250*(Y-SY)/RA-250*3*(X-SX)/RA/5
  328. 3280 PY%=99-250*(Z-SZ)/RA+250*4*(X-SX)/RA/5
  329. 3290 RP=127.5!*(Z-SZ+.8!*RA)/RA
  330. 3300 COLOR ,,[(GRCO% AND 1)*255*COUNTA%/(DEN%-1),(GRCO% AND 4)/4*RP*(RP<=255)*(RP>=0),(GRCO% AND 2)/2*255*COUNTB%/(DEN%-1)]:PSET (PX%,PY%)
  331. 3310 ON -1*(INKEY$<>"") GOTO 3340
  332. 3320 NEXT COUNTB%
  333. 3330 NEXT COUNTA%
  334. 3340 RETURN
  335. 3350 REM == WIRE FRAME
  336. 3360 FOR COUNTA%=0 TO DEN%-1
  337. 3370 FOR COUNTB%=0 TO DEN%-1
  338. 3380 X=SX+RA*COUNTA%/DEN%:Y=SY+RA*COUNTB%/DEN%:GOSUB 3550
  339. 3390 PX%=149+250*(Y-SY)/RA-250*3*(X-SX)/RA/5
  340. 3400 PY%=99-250*(Z-SZ)/RA+250*4*(X-SX)/RA/5
  341. 3410 X=SX+RA*COUNTA%/DEN%:Y=SY+RA*(COUNTB%+1)/DEN%:GOSUB 3550
  342. 3420 PX1%=149+250*(Y-SY)/RA-250*3*(X-SX)/RA/5
  343. 3430 PY1%=99-250*(Z-SZ)/RA+250*4*(X-SX)/RA/5
  344. 3440 RP=127.5!*(Z-SZ+.8!*RA)/RA
  345. 3450 COLOR ,,[(GRCO% AND 1)*255*COUNTA%/(DEN%-1),(GRCO% AND 4)/4*RP*(RP<=255)*(RP>=0),(GRCO% AND 2)/2*255*COUNTB%/(DEN%-1)]:LINE (PX%,PY%)-(PX1%,PY1%),PSET
  346. 3460 X=SX+RA*(COUNTA%+1)/DEN%:Y=SY+RA*(COUNTB%)/DEN%:GOSUB 3550
  347. 3470 PX1%=149+250*(Y-SY)/RA-250*3*(X-SX)/RA/5
  348. 3480 PY1%=99-250*(Z-SZ)/RA+250*4*(X-SX)/RA/5
  349. 3490 LINE (PX%,PY%)-(PX1%,PY1%),PSET
  350. 3500 ON -1*(INKEY$<>"") GOTO 3340
  351. 3510 NEXT COUNTB%
  352. 3520 NEXT COUNTA%
  353. 3530 RETURN
  354. 3540 REM  = PROCESSING SYSTEM TYPE-50 ========
  355. 3550 IFN%=0
  356. 3560 WHILE(IFA%(IFN%)<>0)
  357. 3570 ON (IFA%(IFN%) AND &H000C)/4+1 GOSUB 3650,3670,3690,3710
  358. 3580 ON (IFA%(IFN%) AND &H0003)+1 GOSUB 3730,3750,3770,3790
  359. 3590 ON (IFA%(IFN%) AND &H0700)/256 GOSUB 3820,3840,3860,3880,3900
  360. 3600 ON (IFA%(IFN%) AND &H00F0)/16 GOSUB 3930,3950,3970,3990,4010,4030,4050
  361. 3610 IFN%=IFN%+1
  362. 3620 WEND
  363. 3630 Z=ANS(IFN%-1):RETURN'リターン
  364. 3640 REM == 定数でなかった時の数値代入
  365. 3650 PRO(2*IFN%)=IFB(2*IFN%)
  366. 3660 RETURN
  367. 3670 PRO(2*IFN%)=ANS(IFB(2*IFN%))
  368. 3680 RETURN
  369. 3690 PRO(2*IFN%)=X
  370. 3700 RETURN
  371. 3710 PRO(2*IFN%)=Y
  372. 3720 RETURN
  373. 3730 PRO(2*IFN%+1)=IFB(2*IFN%+1)
  374. 3740 RETURN
  375. 3750 PRO(2*IFN%+1)=ANS(IFB(2*IFN%+1))
  376. 3760 RETURN
  377. 3770 PRO(2*IFN%+1)=X
  378. 3780 RETURN
  379. 3790 PRO(2*IFN%+1)=Y
  380. 3800 RETURN
  381. 3810 REM == 演算子処理
  382. 3820 ANS(IFN%)=PRO(2*IFN%)+PRO(2*IFN%+1)
  383. 3830 RETURN
  384. 3840 ANS(IFN%)=PRO(2*IFN%)-PRO(2*IFN%+1)
  385. 3850 RETURN
  386. 3860 ANS(IFN%)=PRO(2*IFN%)*PRO(2*IFN%+1)
  387. 3870 RETURN
  388. 3880 ANS(IFN%)=PRO(2*IFN%)/PRO(2*IFN%+1)
  389. 3890 RETURN
  390. 3900 ANS(IFN%)=PRO(2*IFN%)^PRO(2*IFN%+1)
  391. 3910 RETURN
  392. 3920 REM == 各種関数処理
  393. 3930 ANS(IFN%)=ABS(PRO(2*IFN%))
  394. 3940 RETURN
  395. 3950 ANS(IFN%)=SIN(PRO(2*IFN%))
  396. 3960 RETURN
  397. 3970 ANS(IFN%)=COS(PRO(2*IFN%))
  398. 3980 RETURN
  399. 3990 ANS(IFN%)=TAN(PRO(2*IFN%))
  400. 4000 RETURN
  401. 4010 ANS(IFN%)=ATN(PRO(2*IFN%))
  402. 4020 RETURN
  403. 4030 ANS(IFN%)=EXP(PRO(2*IFN%))
  404. 4040 RETURN
  405. 4050 ANS(IFN%)=LOG(PRO(2*IFN%))
  406. 4060 RETURN
  407. 4070 REM = FUNCTION ANALYSIS SYSTEM TYPE-50 =
  408. 4080 REM = 内部登録部
  409. 4090 REM == 文字列FUN$をIFUN$に変換
  410. 4100 IFUN$="   "+FUN$+" ":IFN%=0
  411. 4110 REM == 配列変数の初期化
  412. 4120 FOR COUNTA%=0 TO 24
  413. 4130 IFA%(COUNTA%)=0:IFB(2*COUNTA%)=0:IFB(2*COUNTA%+1)=0
  414. 4140 NEXT COUNTA%
  415. 4150 REM == 文字列IFUN$のアドレス4バイト、文字数2バイトを取得
  416. 4160 IFAD&=PEEK ([&H14]VARPTR(IFUN$),4)
  417. 4170 CURM%=PEEK ([&H14]VARPTR(IFUN$)+4,2)-1
  418. 4180 REM == 式解析
  419. 4190 CUR%=0
  420. 4200 GOSUB 4350:GOSUB 4430
  421. 4210 GOSUB 4390:GOSUB 4490
  422. 4220 GOSUB 4390:GOSUB 4560
  423. 4230 GOSUB 4390:GOSUB 4630
  424. 4240 REM == 内部登録終了確認
  425. 4250 FOR CUR%=0 TO CURM%
  426. 4260 WHIA%=PEEK(IFAD&+CUR%,1)
  427. 4270 IF WHIA%=ASC("+") OR WHIA%=ASC("-") OR WHIA%=ASC("*") OR WHIA%=ASC("/") OR WHIA%=ASC("^") THEN 4190
  428. 4280 NEXT CUR%
  429. 4290 REM  == 値のみの場合の内部登録
  430. 4300 IF PEEK(IFAD&+3,1)<57 THEN IFA%(0)=256:IFB(0)=VAL(IFUN$)
  431. 4310 IF PEEK(IFAD&+3,1)=88 THEN IFA%(0)=264
  432. 4320 IF PEEK(IFAD&+3,1)=89 THEN IFA%(0)=268 
  433. 4330 RETURN 'リターン
  434. 4340 REM == 「)」を探して「(」に引き返す、なければスタート
  435. 4350 IF PEEK(IFAD&+CUR%,1)=ASC(")") OR CUR%=CURM% THEN GOSUB 4390:RETURN
  436. 4360 CUR%=CUR%+1
  437. 4370 GOTO 4350
  438. 4380 REM == 「(」またはスタートに引き返す
  439. 4390 IF PEEK(IFAD&+CUR%,1)=ASC("(") OR CUR%=3 THEN RETURN
  440. 4400 CUR%=CUR%-1
  441. 4410 GOTO 4390
  442. 4420 REM == 「^」を探して内部形式登録
  443. 4430 WHIA%=PEEK(IFAD&+CUR%,1)
  444. 4440 IF WHIA%=ASC("^") THEN IP%=5:GOSUB 4660
  445. 4450 IF WHIA%=ASC(")") OR CUR%=CURM% THEN RETURN
  446. 4460 CUR%=CUR%+1
  447. 4470 GOTO 4430
  448. 4480 REM == 「* /」を探して内部形式登録
  449. 4490 WHIA%=PEEK(IFAD&+CUR%,1)
  450. 4500 IF WHIA%=ASC("*") THEN IP%=3:GOSUB 4660
  451. 4510 IF WHIA%=ASC("/") THEN IP%=4:GOSUB 4660
  452. 4520 IF WHIA%=ASC(")") OR CUR%=CURM% THEN RETURN 
  453. 4530 CUR%=CUR%+1
  454. 4540 GOTO 4490
  455. 4550 REM == 「+ -」を探して内部形式登録
  456. 4560 WHIA%=PEEK(IFAD&+CUR%,1)
  457. 4570 IF WHIA%=ASC("+") THEN IP%=1:GOSUB 4660
  458. 4580 IF WHIA%=ASC("-") THEN IP%=2:GOSUB 4660
  459. 4590 IF WHIA%=ASC(")") OR CUR%=CURM% THEN RETURN 
  460. 4600 CUR%=CUR%+1
  461. 4610 GOTO 4560
  462. 4620 REM == 残った数値の処理、関数内部登録
  463. 4630 IF PEEK(IFAD&+CUR%,1)=ASC("(") THEN GOSUB 4980
  464. 4640 RETURN
  465. 4650 REM == 内部形式登録(INTERNAL FUNCTION TYPE-50)
  466. 4660 IFA%(IFN%)=IFA%(IFN%)+IP%*256
  467. 4670 REM == 右の値の登録
  468. 4680 CURA%=CUR%
  469. 4690 WHIA%=PEEK(IFAD&+CURA%+1,1)
  470. 4700 IF WHIA%=ASC("X") THEN IFA%(IFN%)=IFA%(IFN%)+2
  471. 4710 IF WHIA%=ASC("Y") THEN IFA%(IFN%)=IFA%(IFN%)+3
  472. 4720 IF WHIA%>199 THEN IFA%(IFN%)=IFA%(IFN%)+1:IFB(2*IFN%+1)=WHIA%-200
  473. 4730 IFB(2*IFN%+1)=IFB(2*IFN%+1)+VAL(MID$(IFUN$,CURA%+2,CURM%-CURA%))
  474. 4740 REM == 左の値の登録
  475. 4750 WHIA%=PEEK(IFAD&+CURA%-1,1)
  476. 4760 IF WHIA%=ASC("+") OR WHIA%=ASC("-") OR WHIA%=ASC("*") OR WHIA%=ASC("/") OR WHIA%=ASC("^") OR WHIA%=ASC("(") OR CURA%=3 THEN 4790
  477. 4770 CURA%=CURA%-1
  478. 4780 GOTO 4750
  479. 4790 WHIA%=PEEK(IFAD&+CURA%,1)
  480. 4800 IF WHIA%=ASC("X") THEN IFA%(IFN%)=IFA%(IFN%)+8
  481. 4810 IF WHIA%=ASC("Y") THEN IFA%(IFN%)=IFA%(IFN%)+12
  482. 4820 IF WHIA%>199 THEN IFA%(IFN%)=IFA%(IFN%)+4:IFB(2*IFN%)=WHIA%-200
  483. 4830 IFB(2*IFN%)=IFB(2*IFN%)+VAL(MID$(IFUN$,CURA%+1,CURM%-CURA%))
  484. 4840 IF WHIA%=ASC("+") OR WHIA%=ASC("-") THEN IFB(2*IFN%)=0
  485. 4850 REM == IFUN$の書き換え
  486. 4860 REM == IFUN$の部分消去
  487. 4870 WHIB%=CURA%:WHIC=0
  488. 4880 WHIA%=PEEK(IFAD&+CURA%,1)
  489. 4890 IF WHIA%=ASC("+") OR WHIA%=ASC("-") OR WHIA%=ASC("*") OR WHIA%=ASC("/") OR WHIA%=ASC("^") OR WHIA%=ASC(")") OR CURA%=CURM%+1 THEN WHIC=WHIC+1:IF WHIC=2 THEN 4940
  490. 4900 POKE IFAD&+CURA%,ASC(" "),1
  491. 4910 CURA%=CURA%+1
  492. 4920 GOTO 4880
  493. 4930 REM == ブロックの追加
  494. 4940 POKE IFAD&+WHIB%,200+IFN%,1
  495. 4950 IFN%=IFN%+1
  496. 4960 RETURN
  497. 4970 REM == かっこに関する処理
  498. 4980 CURA%=CUR%
  499. 4990 WHIA$=MID$(IFUN$,CURA%-2,2)
  500. 5000 IFF%=(WHIA$="AB")+2*(WHIA$="SI")+3*(WHIA$="CO")+4*(WHIA$="TA")+5*(WHIA$="AT")+6*(WHIA$="EX")+7*(WHIA$="LO")
  501. 5010 IF IFF%=0 THEN GOSUB 5100 ELSE GOSUB 5180
  502. 5020 REM == 「()」の消去
  503. 5030 WHIA%=PEEK(IFAD&+CURA%,1)
  504. 5040 IF WHIA%=ASC("+") OR WHIA%=ASC("-") OR WHIA%=ASC("*") OR WHIA%=ASC("/") OR WHIA%=ASC("^") OR CURA%=CURM%+1 THEN 5080
  505. 5050 POKE IFAD&+CURA%,ASC(" "),1
  506. 5060 CURA%=CURA%+1
  507. 5070 GOTO 5030
  508. 5080 RETURN
  509. 5090 REM == 「()」のみの時
  510. 5100 WHIA%=PEEK(IFAD&+CURA%+1,1)
  511. 5110 IF WHIA%=ASC(")") THEN 5150
  512. 5120 POKE IFAD&+CURA%,WHIA%,1
  513. 5130 CURA%=CURA%+1
  514. 5140 GOTO 5100
  515. 5150 POKE IFAD&+CURA%,0,2
  516. 5160 RETURN
  517. 5170 REM == 「()」が関数のものであるとき
  518. 5180 IFA%(IFN%)=IFA%(IFN%)-16*IFF%
  519. 5190 WHIA%=PEEK(IFAD&+CURA%+1,1)
  520. 5200 IFA%(IFN%)=IFA%(IFN%)-4*((WHIA%>199)+2*(WHIA%=ASC("X"))+3*(WHIA%=ASC("Y")))
  521. 5210 IFB(2*IFN%)=VAL(MID$(IFUN$,CURA%+2,CURM%-CURA%))-(WHIA%>199)*(WHIA%-200)
  522. 5220 POKE IFAD&+CURA%-3,200+IFN%,1
  523. 5230 IFN%=IFN%+1
  524. 5240 CURA%=CURA%-2
  525. 5250 RETURN
  526. 5260 REM == トラップ処理
  527. 5270 RESUME 40
  528.